#pragma once

// Ejercicio 5 - a

#include "../excepciones/Excepciones.h"

const int tamano = 10;

template<class TElem>
class TDosPilas
{
public:
	TDosPilas();
	~TDosPilas();

	void apilar1(const TElem& elem) throw (EDesbordamiento);
	void apilar2(const TElem& elem) throw (EDesbordamiento);

	void desapilar1() throw (EAccesoIndebido);
	void desapilar2() throw (EAccesoIndebido);

	const TElem& cima1() const throw (EAccesoIndebido);
	const TElem& cima2() const throw (EAccesoIndebido);

	bool esVacio1() const;
	bool esVacio2() const;

private:
	bool esLleno() const;

private:
	TElem _vector[tamano];
	int _indice1;
	int _indice2;
};

	template<class TElem>
	TDosPilas<TElem>::TDosPilas() : _indice1(-1), _indice2(tamano)
	{}

	template<class TElem>
	TDosPilas<TElem>::~TDosPilas()
	{}

	template<class TElem>
	void TDosPilas<TElem>::apilar1(const TElem& elem) throw (EDesbordamiento)
	{
		if(esLleno())
			throw EDesbordamiento();

		_indice1++;
		_vector[_indice1] = elem;
	}

	template<class TElem>
	void TDosPilas<TElem>::apilar2(const TElem& elem) throw (EDesbordamiento)
	{
		if(esLleno())
			throw EDesbordamiento();

		_indice2--;
		_vector[_indice2] = elem;
	}

	template<class TElem>
	void TDosPilas<TElem>::desapilar1() throw (EAccesoIndebido)
	{
		if(esVacio1())
			throw EAccesoIndebido();

		_indice1--;
	}

	template<class TElem>
	void TDosPilas<TElem>::desapilar2() throw (EAccesoIndebido)
	{
		if(esVacio2())
			throw EAccesoIndebido();

		_indice2++;
	}

	template<class TElem>
	const TElem& TDosPilas<TElem>::cima1() const throw (EAccesoIndebido)
	{
		if(esVacio1())
			throw EAccesoIndebido();

		return _vector[_indice1];
	}

	template<class TElem>
	const TElem& TDosPilas<TElem>::cima2() const throw (EAccesoIndebido)
	{
		if(esVacio2())
			throw EAccesoIndebido();

		return _vector[_indice2];
	}

	template<class TElem>
	bool TDosPilas<TElem>::esVacio1() const
	{
		return _indice1 == -1;
	}


	template<class TElem>
	bool TDosPilas<TElem>::esVacio2() const
	{
		return _indice2 == tamano;
	}


	template<class TElem>
	bool TDosPilas<TElem>::esLleno() const
	{
		return (_indice1 + 1 == _indice2);
	}

